package com.meter.common.handler;

import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;
import com.meter.common.utils.DateUtils;
import com.meter.common.utils.StringUtils;

import java.util.Arrays;
import java.util.List;

/**
 * 表名格式化
 */
public class MyTableNameHandler implements TableNameHandler {

    /**
     * 用于记录那些表可以使用该月份动态表明处理器
     */
    private List<String> tableNames;

    /**
     * 构造函数，构造动态表明处理器的时候，传递tableNames参数
     * @param tableNames
     */
    public MyTableNameHandler(String ...tableNames) {
        this.tableNames = Arrays.asList(tableNames);
    }

    /**
     * 每个请求线程维护一个month数据，避免多线程数据冲突，使用ThreadLocal
     */
    private static final ThreadLocal<String> MONTH_DATA = new ThreadLocal<>();

    /**
     * 设置请求线程的month数据
     * @param month
     */
    public static void setData(String month) {
        MONTH_DATA.set(month);
    }

    /**
     * 设置默认请求线程的month数据
     */
    public static void setData() {
        MONTH_DATA.set(DateUtils.getMonth(DateUtils.getDate()));
    }

    /**
     * 删除当前请求线程的month数据
     */
    public static void removeData() {
        MONTH_DATA.remove();
    }

    /**
     * 动态表明接口实现方法
     * @param sql
     * @param tableName
     * @return
     */
    @Override
    public String dynamicTableName(String sql, String tableName) {
        if(this.tableNames.contains(tableName)) {
            String month = "";
            if(StringUtils.isNull(MONTH_DATA.get())){
                month = DateUtils.getMonth(DateUtils.getDate());
            }else{
                month = MONTH_DATA.get();
            }
            return tableName + "_" + month;
        }else{
            return tableName;
        }
    }
}
